// 1.5. 函数-参数的默认值
/**
 * C++ 函数
 * 函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数，即主函数 main() ，所有简单的程序都可以定义其他额外的函数。
 * 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的，但在逻辑上，划分通常是根据每个函数执行一个特定的任务来进行的。
 * 函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。 
 * C++ 标准库提供了大量的程序可以调用的内置函数。例如，函数 strcat() 用来连接两个字符串，函数 memcpy() 用来复制内存到另一个位置。
 * 函数还有很多叫法，比如方法、子例程或程序，等等。
 * 
 * ---------------------
 * 参数的默认值
 * 当您定义一个函数，您可以为参数列表中后边的每一个参数指定默认值。当调用函数时，如果实际参数的值留空，则使用这个默认值。
 * 这是通过在函数定义中使用赋值运算符来为参数赋值的。调用函数时，如果未传递参数的值，则会使用默认值，如果指定了值，则会忽略默认值，使用传递的值。
 * 
 * ~~~~~~~~~~~~~~~
 * 
*/
#include <iostream>
// int sum(int, int);
// int sum(int); // 无效匹配不到，调用时报错

int sum(int a = -1, int b = 0)
{
  std::cout << "传入的a: " << a << "\n"
            << "传入的b: " << b << std::endl;
  return a + b;
}

int main(void)
{
  int a = 1;
  int b = 2;
  int val1 = sum(a, b);
  std::cout << "val1 : " << val1 << std::endl;

  int val2 = sum(a);
  std::cout << "val2 : " << val2 << std::endl;

  // int val3 = sum(, b); // 报错
  // std::cout << "val3 : " << val3 << std::endl;

  int val4 = sum(NULL, b); // warning: passing NULL to non-pointer argument 1 of 'int sum(int, int)'
  //  a => 0 b => b 隐式类型转换
  std::cout << "val4 : " << val4 << std::endl;

  int val5 = sum(0, b); //
  std::cout << "val5 : " << val5 << std::endl;

  int val6 = sum(1.23); // a => 1 隐式类型转换 b=>默认值
  std::cout << "val6 : " << val6 << std::endl;

  int val7 = sum('\0'); // a => 0 隐式类型转换 b=>默认值
  std::cout << "val7 : " << val7 << std::endl;

  int val8 = sum('A'); // a => 65 隐式类型转换 b=>默认值
  std::cout << "val8 : " << val8 << std::endl;

  int val9 = sum(false); // a => 0 隐式类型转换 b=>默认值
  std::cout << "val9 : " << val9 << std::endl;

  printf("---------end-----------");
  return 0;
}

// 函数定义

/**
 * 求和
*/

// int sum(int a = 0, int b = 0)
// {
//   std::cout << "传入的a: " << a << "\n"
//             << "传入的b: " << b << std::endl;
//   return a + b;
// }
